package com.snow.java.base.junit;

import com.snow.java.base.entity.Student;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * @类名称：
 * @类描述：
 * @author: bingHeng
 * @Date 2019.04.05
 * @Version: 1.0
*/
public class MyLambad3 {

    /**
     * 方法引用
     *
     *  方法引用：若Lambda体中的内容有方法已经实现了，我们可以使用"方法引用"， 可以理解为方法引用是Lambda表达式的另外一种表现形式
     *  方法引用主要有三种语法格式：
     *      对象::实例方法名
     *      类::静态方法名
     *      类::实例方法名
     *
     *  注意：
     *      ①Lambda体中调用方法的参数列表与返回值类型，要与函数式接口中抽象方法的参数列表和返回值类型保持一致。
     *      ②若Lambda参数列表中的第一个参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName::method
     */

    public static void main(String[] args) {

        // 常规的Lambda表达式
        Consumer<String> consumer = (m) -> System.out.println(m);
        consumer.accept("你是我的小苹果");

        // 对象::实例方法名   要求：需要实现的抽象方法的参数列表和返回值类型 要 与方法引用的参数列表和返回值类型完全一致
        Consumer<String> consumer1 = System.out::println;
        consumer1.accept("你是我的小苹果");

        Student student = new Student();
        student.setName("Tom");
        Supplier<String> supplier = student::getName;
        System.out.println(supplier.get());

        // 常规的Lambda表达式，比较两个数的大小
        Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
        comparator.compare(3, 2);
        // 类::静态方法名, 比较两个数的大小
        Comparator<Integer> comparator1 = Integer::compare;
        int compare = comparator1.compare(3, 20);
        System.out.println(compare);

        // 常规的Lambda表达式：比较两个字符串是否完全一致
        BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);
        boolean test = biPredicate.test("hello", "hello world");
        System.out.println(test);

        //  类::实例方法名  比较两个字符串是否一致
        BiPredicate<String, String> biPredicate1 = String::equals;
        boolean test1 = biPredicate1.test("hello", "hello");
        System.out.println(test1);

    }
}
